De StringBuilder klasse
Het string gegevenstype stelt een onveranderlijke tekst voor. Eenmaal een string gecreëerd is, kan die niet meer gewijzigd worden. Om op een efficiënte manier een string dynamisch opbouwen beschikt het FCL (Framework Class Library) over een type System.Text.StringBuilder waarmee je dynamische bewerkingen met strings en karakters kan uitvoeren. Logisch gezien bestaat een StringBuilder object uit een veld die verwijst naar een array van char structuren. Met leden van de klasse StringBuilder kan je die karakterarray manipuleren. Als de string is opgebouwd kan je de array van karakters converteren naar een string met behulp van de StringBuilder.ToString() methode. Die methode retourneert een referentie naar het string veld dat in het StringBuilder object wordt bijgehouden. Dat maakt de ToString methode van StringBuilder zeer snel omdat de array van karakters niet gekopieerd wordt. De string die door de ToString methode wordt geretourneerd wijzig je best niet meer. Zie hieronder om te weten waarom.
De constructor van de StringBuilder klasse
De CLR en een taal als C# bezit geen speciale informatie over de StringBuilder klasse. C# beschouwt het niet als een primitief type en dus moet je een object aanmaken zoals je dat voor alle niet primitieve gegevenstypes zou doen:
private StringBuilder sb = new StringBuilder();
De StringBuilder heeft verschillende constructors. De taak van elke constructor bestaat erin de toestand te initialiseren van elk StringBuilder object:
- Maximale capaciteit: Een int32 waarde die het maximum aantal karakters bepaalt van de string. De standaard waarde is Int32.MaxValue (ongeveer 2 biljoen). Het is niet gebruikelijk die instelling te wijzigen.
- Capaciteit: Een Int32 waarde die de grootte van de array van karakters aangeeft. De standaard waarde is 16. Als de string boven de capaciteit uitgroeit verdubbelt StringBuilder automatisch het capaciteitsveld, plaatst een nieuwe array op heap en kopieert de karakters van de oude array in de nieuwe. Als de array dynamisch groeit is dat ten koste van performantie. Als je dus een idee hebt van hoelang de string zal zijn kan je die waarde hier instellen
- Karakter array: Een array van het type Char waarin de karakters van de string geplaatst zullen worden. Als je een string meegeeft als parameter in de constructor wordt de array op die basis geïnitialiseerd. Als je geen string meegeeft wordt de array op 0 elementen gezet, dwz de Length eigenschap retourneert 0.
De leden van StringBuilder klasse
In tegenstelling met een String, stelt een StringBuilder object een wijzigbare string voor. Dus de meeste leden wijzigen de inhoud in de array van karakters en toch worden er geen nieuwe objecten op de managed heap geplaatst. De StringBuilder plaatst een nieuw object op de heap slechts in twee gevallen:
- Je bouwt dynamisch een string op waarvan de lengte groter is dan de ingestelde capaciteit.
- Je probeert de array van karakters te wijzigen nadat je de ToString methode hebt aangeroepen.
Een overzicht van de leden van de StringBuilder klasse:
Lid | Type | Beschrijving |
MaxCapacity | Alleen lezen eigenschap | Retourneert het maximum aantal karakters die in de string geplaatst kan worden. |
Capacity | Schrijven/lezen | Bepaalt of retourneert de grootte van de karakter array. Als de ingestelde grootte groter is dan de string of groter dan MaxCapacity veroorzaakt MaxCapacity een foutmelding ArgumentOutOfRangeException. |
EnsureCapacity | Methode | Zorgt ervoor dat de karakter array tenminste de ingesteld e grootte heeft. |
Length | Schrijven/lezen | Bepaalt of retourneert het aantal karakters in de string. Indien die nu nul is wordt de inhoud van StringBuilder een lege string. |
ToString | Methode | Zonder parameters retourneert die methode een String die de karakter array van StringBuilder voorstelt. |
Chars | Read/Write indexer | Bepaalt of retourneert het karakter op die positie. |
Append | Methode | Voegt een object toe aan het einde van de karakter array. De array wordt indien nodig groter gemaakt. Het object wordt naar een string geconverteerd met behulp van algemene format regels en met de ingestelde cultuur van de huidige thread. |
Insert | Methode | Voegt een object toe in de karakter array. |
AppendFormat | Methode | Voegt een object aan het einde van de karakter toe. Voor de formatteringopties, zie Tekenreeksen formatteren. |
AppendLine | Methode | Doet hetzelfde als Append maar voegt een witte lijn aan het einde toe. |
Replace | Methode | |
Remove | Methode | |
Equals | Methode | |
CopyTo | Methode | Kopieert een subset van de karakters van StringBuilder naar een char array. |
Oefening
Maak een methode die de efficiëntie van String vergelijkt met StringBuilder.